package cn.tedu.search.repository;

import cn.tedu.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

// Repository 是spring家族框架对持久层的命名
@Repository
public interface ItemRepository extends
                                ElasticsearchRepository<Item,Long>  {
    // ItemRepository接口要继承SpringData提供的ElasticsearchRepository父接口
    // 一旦继承,当前接口就会被识别为连接ES的持久层类,SpringData会自动为它生成基本增删改查方法
    // ElasticsearchRepository<[关联的实体类名称],[实体类主键类型]>

    // SpringData自定义查询
    // 可以通过遵循SpringData框架给定的格式定义方法名称,
    // SpringData会根据方法名称自动生成查询语句
    // query(查询):表示当前方法是一个查询方法,类似sql语句中的select
    // Item/Items:确定要查询哪一个实体类,不带s的是单个对象,带s是集合
    // By(通过/根据):标识开始设置查询条件,类似sql语句中的where
    // Title:要查询的字段,可以根据查询条件修改为Item中的任何字段
    // Matches:执行查询的操作,Matches表示字符串的匹配,而且这个匹配是支持分词的,类似sql语句的like
    Iterable<Item> queryItemsByTitleMatches(String title);


    // 多条件查询
    // 多个条件之间我们需要使用And和Or来分隔,来表示他们的查询逻辑
    // 方法的参数赋值是依据方法定义的参数顺序依次向条件中赋值的
    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(
                                    String title,String brand);

    // 排序查询
    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title,String brand);

    // 分页查询
    // 返回值修改为Page类型,这个类型中包含了查询到的分页数据,和本次查询相关的分页信息
    // 分页信息包含:当前页,总页数,总条数,每页条数,是否有上一页或下一页等
    // 方法参数,在所有的参数后再添加一个新的参数类型,Pageable

    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand, Pageable pageable);


}
